home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / apps / circuits / spice2g6.z / spice2g6 / spice / Fortran / matptr.f < prev    next >
Encoding:
Text File  |  1989-02-03  |  11.8 KB  |  437 lines

  1.       subroutine matptr
  2.       implicit double precision (a-h,o-z)
  3. c
  4. c     this routine (by calls to the routine reserve) establishes the
  5. c nonzero-element structure of the circuit equation coefficient matrix.
  6. c
  7. c spice version 2g.6  sccsid=tabinf 3/15/83
  8.       common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem,
  9.      1   isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize,
  10.      2   junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr,
  11.      3   nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1,
  12.      4   lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd,
  13.      5   imynl,imvn,lcvn,nsnod,nsmat,nsval,icnod,icmat,icval,
  14.      6   loutpt,lpol,lzer,irswpf,irswpr,icswpf,icswpr,irpt,jcpt,
  15.      7   irowno,jcolno,nttbr,nttar,lvntmp
  16. c spice version 2g.6  sccsid=cirdat 3/15/83
  17.       common /cirdat/ locate(50),jelcnt(50),nunods,ncnods,numnod,nstop,
  18.      1   nut,nlt,nxtrm,ndist,ntlin,ibr,numvs,numalt,numcyc
  19. c spice version 2g.6  sccsid=blank 3/15/83
  20.       common /blank/ value(200000)
  21.       integer nodplc(64)
  22.       complex cvalue(32)
  23.       equivalence (value(1),nodplc(1),cvalue(1))
  24. c
  25. c  allocate and initialize storage
  26. c
  27.       call getm4(isr,nstop+1)
  28.       numvs=jelcnt(3)+jelcnt(6)+jelcnt(8)+jelcnt(9)+2*jelcnt(17)
  29.       call getm4(iseq,numvs)
  30.       call getm4(iseq1,numvs)
  31.       call getm4(neqn,numvs)
  32.       call getm4(nodevs,numnod)
  33.       call getm4(ndiag,nstop)
  34.       call getm4(nmoffc,nstop)
  35.       call getm4(numoff,nstop)
  36.       call getm4(irpt,nstop)
  37.       call getm4(jcpt,nstop)
  38.       call getm4(irowno,nstop)
  39.       call getm4(jcolno,nstop)
  40.       call slpmem(irpt,nstop)
  41.       call slpmem(jcpt,nstop)
  42.       call slpmem(irowno,nstop)
  43.       call slpmem(jcolno,nstop)
  44.       call crunch
  45. c
  46.       call zero4(nodplc(irpt+1),nstop)
  47.       call zero4(nodplc(jcpt+1),nstop)
  48.       call zero4(nodplc(irowno+1),nstop)
  49.       call zero4(nodplc(jcolno+1),nstop)
  50.       call zero4(nodplc(iseq1+1),numvs)
  51.       call zero4(nodplc(nodevs+1),numnod)
  52.       call zero4(nodplc(ndiag+1),nstop)
  53.       call zero4(nodplc(nmoffc+1),nstop)
  54.       call zero4(nodplc(numoff+1),nstop)
  55. c
  56.       numvs=0
  57.       nxtrm=0
  58.       ndist=0
  59.       ntlin=1
  60.       ibr=numnod
  61. c
  62. c  resistors
  63. c
  64.       loc=locate(1)
  65.   110 if ((loc.eq.0).or.(nodplc(loc+8).ne.0)) go to 120
  66.       node1=nodplc(loc+2)
  67.       node2=nodplc(loc+3)
  68.       call reserv(node1,node1)
  69.       call reserv(node1,node2)
  70.       call reserv(node2,node1)
  71.       call reserv(node2,node2)
  72.       loc=nodplc(loc)
  73.       go to 110
  74. c
  75. c  capacitors
  76. c
  77.   120 loc=locate(2)
  78.   130 if ((loc.eq.0).or.(nodplc(loc+12).ne.0)) go to 400
  79.       node1=nodplc(loc+2)
  80.       node2=nodplc(loc+3)
  81.       call reserv(node1,node2)
  82.       call reserv(node2,node1)
  83.       ntemp=nodplc(ndiag+node1)
  84.       call reserv(node1,node1)
  85.       nodplc(ndiag+node1)=ntemp
  86.       ntemp=nodplc(ndiag+node2)
  87.       call reserv(node2,node2)
  88.       nodplc(ndiag+node2)=ntemp
  89.       nodplc(loc+8)=nxtrm+1
  90.       nxtrm=nxtrm+2
  91.       loc=nodplc(loc)
  92.       go to 130
  93. c
  94. c  inductors
  95. c
  96.   400 loc=locate(3)
  97.   430 if ((loc.eq.0).or.(nodplc(loc+14).ne.0)) go to 440
  98.       node1=nodplc(loc+2)
  99.       node2=nodplc(loc+3)
  100.       ibr=ibr+1
  101.       nodplc(loc+5)=ibr
  102.       call reserv(node1,ibr)
  103.       call reserv(node2,ibr)
  104.       call reserv(ibr,node1)
  105.       call reserv(ibr,node2)
  106.       ntemp=nodplc(ndiag+ibr)
  107.       call reserv(ibr,ibr)
  108.       nodplc(ndiag+ibr)=ntemp
  109.       numvs=numvs+1
  110.       nodplc(iseq+numvs)=loc
  111.       nodplc(neqn+numvs)=ibr
  112.       nodplc(nodevs+node1)=nodplc(nodevs+node1)+1
  113.       nodplc(nodevs+node2)=nodplc(nodevs+node2)+1
  114.       nodplc(loc+11)=nxtrm+1
  115.       nxtrm=nxtrm+2
  116.       loc=nodplc(loc)
  117.       go to 430
  118. c
  119. c  mutual inductors
  120. c
  121.   440 loc=locate(4)
  122.   450 if ((loc.eq.0).or.(nodplc(loc+6).ne.0)) go to 460
  123.       nl1=nodplc(loc+2)
  124.       nl2=nodplc(loc+3)
  125.       nl1=nodplc(nl1+5)
  126.       nl2=nodplc(nl2+5)
  127.       call reserv(nl1,nl2)
  128.       call reserv(nl2,nl1)
  129.       loc=nodplc(loc)
  130.       go to 450
  131. c
  132. c  nonlinear voltage-controlled current sources
  133. c
  134.   460 loc=locate(5)
  135.   462 if ((loc.eq.0).or.(nodplc(loc+13).ne.0)) go to 464
  136.       node1=nodplc(loc+2)
  137.       node2=nodplc(loc+3)
  138.       ndim=nodplc(loc+4)
  139.       ndim2=ndim+ndim
  140.       locn=nodplc(loc+6)
  141.       do 463 i=1,ndim2
  142.       node=nodplc(locn+i)
  143.       call reserv(node1,node)
  144.       call reserv(node2,node)
  145.   463 continue
  146.       nodplc(loc+12)=nxtrm+1
  147.       nxtrm=nxtrm+1+ndim2
  148.       loc=nodplc(loc)
  149.       go to 462
  150. c
  151. c  nonlinear voltage controlled voltage sources
  152. c
  153.   464 loc=locate(6)
  154.   466 if ((loc.eq.0).or.(nodplc(loc+14).ne.0)) go to 468
  155.       node1=nodplc(loc+2)
  156.       node2=nodplc(loc+3)
  157.       ibr=ibr+1
  158.       nodplc(loc+6)=ibr
  159.       call reserv(node1,ibr)
  160.       call reserv(node2,ibr)
  161.       call reserv(ibr,node1)
  162.       call reserv(ibr,node2)
  163.       numvs=numvs+1
  164.       nodplc(iseq+numvs)=loc
  165.       nodplc(neqn+numvs)=ibr
  166.       nodplc(nodevs+node1)=nodplc(nodevs+node1)+1
  167.       nodplc(nodevs+node2)=nodplc(nodevs+node2)+1
  168.       ndim=nodplc(loc+4)
  169.       ndim2=ndim+ndim
  170.       locn=nodplc(loc+7)
  171.       do 467 i=1,ndim2
  172.       node=nodplc(locn+i)
  173.       call reserv(ibr,node)
  174.   467 continue
  175.       nodplc(loc+13)=nxtrm+1
  176.       nxtrm=nxtrm+2+ndim2
  177.       loc=nodplc(loc)
  178.       go to 466
  179. c
  180. c  voltage sources
  181. c
  182.   468 loc=locate(9)
  183.   470 if ((loc.eq.0).or.(nodplc(loc+11).ne.0)) go to 472
  184.       node1=nodplc(loc+2)
  185.       node2=nodplc(loc+3)
  186.       ibr=ibr+1
  187.       nodplc(loc+6)=ibr
  188.       call reserv(node1,ibr)
  189.       call reserv(node2,ibr)
  190.       call reserv(ibr,node1)
  191.       call reserv(ibr,node2)
  192.       numvs=numvs+1
  193.       nodplc(iseq+numvs)=loc
  194.       nodplc(neqn+numvs)=ibr
  195.       nodplc(nodevs+node1)=nodplc(nodevs+node1)+1
  196.       nodplc(nodevs+node2)=nodplc(nodevs+node2)+1
  197.       loc=nodplc(loc)
  198.       go to 470
  199. c
  200. c  nonlinear current controlled current sources
  201. c
  202.   472 loc=locate(7)
  203.   474 if ((loc.eq.0).or.(nodplc(loc+13).ne.0)) go to 476
  204.       node1=nodplc(loc+2)
  205.       node2=nodplc(loc+3)
  206.       ndim=nodplc(loc+4)
  207.       locvs=nodplc(loc+6)
  208.       do 475 i=1,ndim
  209.       locvst=nodplc(locvs+i)
  210.       kbr=nodplc(locvst+6)
  211.       call reserv(node1,kbr)
  212.       call reserv(node2,kbr)
  213.   475 continue
  214.       nodplc(loc+12)=nxtrm+1
  215.       nxtrm=nxtrm+1+ndim+ndim
  216.       loc=nodplc(loc)
  217.       go to 474
  218. c
  219. c  nonlinear current controlled voltage sources
  220. c
  221.   476 loc=locate(8)
  222.   478 if ((loc.eq.0).or.(nodplc(loc+14).ne.0)) go to 500
  223.       node1=nodplc(loc+2)
  224.       node2=nodplc(loc+3)
  225.       ibr=ibr+1
  226.       nodplc(loc+6)=ibr
  227.       call reserv(node1,ibr)
  228.       call reserv(node2,ibr)
  229.       call reserv(ibr,node1)
  230.       call reserv(ibr,node2)
  231.       numvs=numvs+1
  232.       nodplc(iseq+numvs)=loc
  233.       nodplc(neqn+numvs)=ibr
  234.       nodplc(nodevs+node1)=nodplc(nodevs+node1)+1
  235.       nodplc(nodevs+node2)=nodplc(nodevs+node2)+1
  236.       ndim=nodplc(loc+4)
  237.       locvs=nodplc(loc+7)
  238.       do 479 i=1,ndim
  239.       locvst=nodplc(locvs+i)
  240.       kbr=nodplc(locvst+6)
  241.       call reserv(ibr,kbr)
  242.   479 continue
  243.       nodplc(loc+13)=nxtrm+1
  244.       nxtrm=nxtrm+2+ndim+ndim
  245.       loc=nodplc(loc)
  246.       go to 478
  247. c
  248. c  diodes
  249. c
  250.   500 loc=locate(11)
  251.   510 if ((loc.eq.0).or.(nodplc(loc+16).ne.0)) go to 520
  252.       node1=nodplc(loc+2)
  253.       node2=nodplc(loc+3)
  254.       node3=nodplc(loc+4)
  255.       call reserv(node1,node1)
  256.       call reserv(node2,node2)
  257.       call reserv(node3,node3)
  258.       call reserv(node1,node3)
  259.       call reserv(node2,node3)
  260.       call reserv(node3,node1)
  261.       call reserv(node3,node2)
  262.       nodplc(loc+11)=nxtrm+1
  263.       nxtrm=nxtrm+5
  264.       nodplc(loc+12)=ndist+1
  265.       ndist=ndist+7
  266.       loc=nodplc(loc)
  267.       go to 510
  268. c
  269. c  transistors
  270. c
  271.   520 loc=locate(12)
  272.   530 if ((loc.eq.0).or.(nodplc(loc+36).ne.0)) go to 540
  273.       node1=nodplc(loc+2)
  274.       node2=nodplc(loc+3)
  275.       node3=nodplc(loc+4)
  276.       node4=nodplc(loc+5)
  277.       node5=nodplc(loc+6)
  278.       node6=nodplc(loc+7)
  279.       node7=nodplc(loc+30)
  280.       locm=nodplc(loc+8)
  281.       locm=nodplc(locm+1)
  282.       cdis=value(locm+32)
  283.       call reserv(node1,node1)
  284.       call reserv(node2,node2)
  285.       call reserv(node3,node3)
  286.       call reserv(node4,node4)
  287.       call reserv(node5,node5)
  288.       call reserv(node6,node6)
  289.       call reserv(node1,node4)
  290.       call reserv(node2,node5)
  291.       call reserv(node3,node6)
  292.       call reserv(node4,node5)
  293.       call reserv(node4,node6)
  294.       call reserv(node5,node6)
  295.       call reserv(node4,node1)
  296.       call reserv(node5,node2)
  297.       call reserv(node6,node3)
  298.       call reserv(node5,node4)
  299.       call reserv(node6,node4)
  300.       call reserv(node6,node5)
  301.       call reserv(node7,node7)
  302.       call reserv(node4,node7)
  303.       call reserv(node7,node4)
  304.       if (cdis.lt.1.0d0) call reserv(node2,node4)
  305.       if (cdis.lt.1.0d0) call reserv(node4,node2)
  306.       nodplc(loc+22)=nxtrm+1
  307.       nxtrm=nxtrm+19
  308.       nodplc(loc+23)=ndist+1
  309.       ndist=ndist+21
  310.       loc=nodplc(loc)
  311.       go to 530
  312. c
  313. c  jfets
  314. c
  315.   540 loc=locate(13)
  316.   550 if ((loc.eq.0).or.(nodplc(loc+25).ne.0)) go to 560
  317.       node1=nodplc(loc+2)
  318.       node2=nodplc(loc+3)
  319.       node3=nodplc(loc+4)
  320.       node4=nodplc(loc+5)
  321.       node5=nodplc(loc+6)
  322.       call reserv(node1,node1)
  323.       call reserv(node2,node2)
  324.       call reserv(node3,node3)
  325.       call reserv(node4,node4)
  326.       call reserv(node5,node5)
  327.       call reserv(node1,node4)
  328.       call reserv(node2,node4)
  329.       call reserv(node2,node5)
  330.       call reserv(node3,node5)
  331.       call reserv(node4,node5)
  332.       call reserv(node4,node1)
  333.       call reserv(node4,node2)
  334.       call reserv(node5,node2)
  335.       call reserv(node5,node3)
  336.       call reserv(node5,node4)
  337.       nodplc(loc+19)=nxtrm+1
  338.       nxtrm=nxtrm+13
  339.       loc=nodplc(loc)
  340.       go to 550
  341. c
  342. c  mosfets
  343. c
  344.   560 loc=locate(14)
  345.   570 if ((loc.eq.0).or.(nodplc(loc+33).ne.0)) go to 600
  346.       node1=nodplc(loc+2)
  347.       node2=nodplc(loc+3)
  348.       node3=nodplc(loc+4)
  349.       node4=nodplc(loc+5)
  350.       node5=nodplc(loc+6)
  351.       node6=nodplc(loc+7)
  352.       call reserv(node1,node1)
  353.       call reserv(node2,node2)
  354.       call reserv(node3,node3)
  355.       call reserv(node4,node4)
  356.       call reserv(node5,node5)
  357.       call reserv(node6,node6)
  358.       call reserv(node1,node5)
  359.       call reserv(node2,node4)
  360.       call reserv(node2,node5)
  361.       call reserv(node2,node6)
  362.       call reserv(node3,node6)
  363.       call reserv(node4,node5)
  364.       call reserv(node4,node6)
  365.       call reserv(node5,node6)
  366.       call reserv(node5,node1)
  367.       call reserv(node4,node2)
  368.       call reserv(node5,node2)
  369.       call reserv(node6,node2)
  370.       call reserv(node6,node3)
  371.       call reserv(node5,node4)
  372.       call reserv(node6,node4)
  373.       call reserv(node6,node5)
  374.       nodplc(loc+26)=nxtrm+1
  375.       nxtrm=nxtrm+28
  376.       loc=nodplc(loc)
  377.       go to 570
  378. c
  379. c  transmission lines
  380. c
  381.   600 loc=locate(17)
  382.   610 if ((loc.eq.0).or.(nodplc(loc+33).ne.0)) go to 1000
  383.       node1=nodplc(loc+2)
  384.       node2=nodplc(loc+3)
  385.       node3=nodplc(loc+4)
  386.       node4=nodplc(loc+5)
  387.       ni1=nodplc(loc+6)
  388.       ni2=nodplc(loc+7)
  389.       ibr1=ibr+1
  390.       ibr2=ibr+2
  391.       ibr=ibr+2
  392.       nodplc(loc+8)=ibr1
  393.       nodplc(loc+9)=ibr2
  394.       call reserv(node1,node1)
  395.       call reserv(node1,ni1)
  396.       call reserv(node2,ibr1)
  397.       call reserv(node3,node3)
  398.       call reserv(node4,ibr2)
  399.       call reserv(ni1,node1)
  400.       call reserv(ni1,ni1)
  401.       call reserv(ni1,ibr1)
  402.       call reserv(ni2,ni2)
  403.       call reserv(ni2,ibr2)
  404.       call reserv(ibr1,node2)
  405.       call reserv(ibr1,node3)
  406.       call reserv(ibr1,node4)
  407.       call reserv(ibr1,ni1)
  408.       call reserv(ibr1,ibr2)
  409.       call reserv(ibr2,node1)
  410.       call reserv(ibr2,node2)
  411.       call reserv(ibr2,node4)
  412.       call reserv(ibr2,ni2)
  413.       call reserv(ibr2,ibr1)
  414.       call reserv(node3,ni2)
  415.       call reserv(ni2,node3)
  416.       numvs=numvs+1
  417.       nodplc(iseq+numvs)=loc
  418.       nodplc(iseq1+numvs)=1
  419.       nodplc(neqn+numvs)=ibr1
  420.       nodplc(nodevs+ni1)=nodplc(nodevs+ni1)+1
  421.       nodplc(nodevs+node2)=nodplc(nodevs+node2)+1
  422.       numvs=numvs+1
  423.       nodplc(iseq+numvs)=loc
  424.       nodplc(iseq1+numvs)=2
  425.       nodplc(neqn+numvs)=ibr2
  426.       nodplc(nodevs+ni2)=nodplc(nodevs+ni2)+1
  427.       nodplc(nodevs+node4)=nodplc(nodevs+node4)+1
  428.       nodplc(loc+30)=ntlin+1
  429.       ntlin=ntlin+2
  430.       loc=nodplc(loc)
  431.       go to 610
  432. c
  433. c  finished
  434. c
  435.  1000 return
  436.       end
  437.